#include <iostream>
#include <string>
#include <functional>
#include <vector>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
#include <unistd.h>

using std::cout;
using std::endl;
using func_t = std::function<void()>;

int gcount = 0;
std::vector<func_t> gfuncs;

// void hanlder(int signo)
// {
//     for (auto &f : gfuncs)
//     {
//         f();
//     }
//     std::cout << "gcount : " << gcount << std::endl;
//     alarm(1);
// }

// // void Handler(int signo)
// // {
// //     // 当对应的信号被触发，内核会将对应的信号编号，传递给自定义方法
// //     std::cout << "Get a signal, signal number is : " << signo << std::endl;
// // }
// int main(int argc, char *argv[])
// {
//     // alarm(1);
//     // int count = 0;
//     // while (1)
//     // {
//     //     // cout << "hello world" << endl;
//     //     // sleep(1);
//     //     cout << count << endl;
//     //     count++;
//     // }

//     // if (argc != 3)
//     // {
//     //     std::cerr << "用法错误" << endl;
//     //     exit(1);
//     // }
//     // int signumber = std::stoi(argv[1]);
//     // pid_t id = std::stoi(argv[2]);

//     // int n = kill(id, signumber);
//     // exit(0);
//     // for (int signo = 1; signo < 32; signo++)
//     // {
//     //     signal(signo, Handler);
//     //     std::cout << "自定义捕捉信号: " << signo << std::endl;
//     // }
//     // while (true)
//     // {
//     //     std::cout << "hello world" << std::endl;
//     //     sleep(1);
//     // }
//     gfuncs.push_back([]()
//                      { std::cout << "我是一个内核刷新操作" << std::endl; });

//     gfuncs.push_back([]()
//                      { std::cout << "我是一个检测进程时间片的操作，如果时间片到了，我会切换进程" << std::endl; });

//     gfuncs.push_back([]()
//                      { std::cout << "我是一个内存管理操作，定期清理操作系统内部的内存碎片" << std::endl; });

//     alarm(1); // 一次性的闹钟，超时alarm会自动被取消
//     signal(SIGALRM, hanlder);

//     while (true)
//     {
//         pause();
//         std::cout << "我醒来了..." << std::endl;
//         gcount++;
//     }

//     return 0;
// }

// void printfpedding(const sigset_t &pedding)
// {

//     std::cout << "curr pending list [" << getpid() << "]: ";

//     for (int sign = 31; sign > 0; sign--)
//     {
//         if (sigismember(&pedding, sign))
//         {
//             cout << 1;
//         }
//         else
//         {
//             cout << 0;
//         }
//     }
//     cout << endl;
// }
// int main()
// {
//     // 1.对2号信号进行屏蔽
//     // 先在站上开辟空间
//     sigset_t block, oblock;
//     sigemptyset(&block);
//     sigemptyset(&oblock);
//     // 1.1添加2号信号
//     sigaddset(&block, 2);
//     sigprocmask(SIG_SETMASK, &block, &oblock);

//     while (1)
//     {
//         sigset_t pedding;
//         sigpending(&pedding);

//         printfpedding(pedding);

//         sleep(1);
//     }
//     return 0;
// }
void printfblock()
{
    sigset_t set, oset;
    sigemptyset(&set);
    sigemptyset(&oset);
    sigprocmask(SIG_BLOCK, &set, &oset);
    std::cout << "block:";
    for (int sign = 31; sign > 0; sign--)
    {
        if (sigismember(&oset, sign))
        {
            std::cout << 1;
        }
        else
        {
            cout << 0;
        }
    }
    cout << endl;
}

void printfPending()
{
    sigset_t pending;
    sigpending(&pending);
    std::cout << "pending:";
    for (int sign = 31; sign > 0; sign--)
    {
        if (sigismember(&pending, sign))
        {
            std::cout << 1;
        }
        else
        {
            cout << 0;
        }
    }
    cout << endl;
}
void handler(int sign)
{
    static int count = 0;
    while (1)
    {
        std::cout << "get a sig" << sign << std::endl;
        // printfblock();
        printfPending();
        sleep(1);
        break;
    }
    // exit(1);
}
int main()
{
    struct sigaction act, oact;
    act.sa_handler = handler;
    sigemptyset(&act.sa_mask);

    ::sigaction(2, &act, &oact);
    while (true)
    {
        // printfblock();
        printfPending();
        pause();
    }
}